package com.pe.regope.presentacion.controller.login;
import java.io.Serializable;

import javax.annotation.PostConstruct;
import javax.annotation.Resource;
import javax.faces.context.ExternalContext;
import javax.faces.context.FacesContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

import org.springframework.context.annotation.Scope;
import org.springframework.security.Authentication;
import org.springframework.security.AuthenticationException;
import org.springframework.security.AuthenticationManager;
import org.springframework.security.context.HttpSessionContextIntegrationFilter;
import org.springframework.security.context.SecurityContext;
import org.springframework.security.context.SecurityContextHolder;
import org.springframework.security.providers.UsernamePasswordAuthenticationToken;
import org.springframework.security.ui.AbstractProcessingFilter;
import org.springframework.security.ui.WebAuthenticationDetails;
import org.springframework.security.ui.webapp.AuthenticationProcessingFilter;
import org.springframework.stereotype.Controller;

import com.pe.regope.negocio.dto.UsuarioDTO;
import com.pe.regope.negocio.service.UserManagerService;

@Controller
@Scope("session")
public class LoginController implements Serializable{

	private static final long serialVersionUID=1L; 
	private String usuarioIngresado;
	private String contraseniaIngresada;
	private Integer perfilSeleccionadoUsuario;
	private UsuarioDTO usuario=new UsuarioDTO();
	private String rutaRaizServidor;
	private String rutaSoloRaizServidor;
	private FacesContext context;
	private HttpServletRequest request;
	private String perfilUsuario;
	private String dirMenu;

	@Resource
	UserManagerService userManagerService;

	@Resource(name="REGOPEAuthenticationManager")
	private AuthenticationManager authenticationManager;

	@PostConstruct
	public void init(){
	}

	public String login(){
		return validacionUsuario(usuarioIngresado, contraseniaIngresada);
	}

	public String validacionUsuario(String usuarioIngresado,String contraseniaIngresada) throws AuthenticationException{
		try {
			Authentication auth =validarContextSecurity(usuarioIngresado,contraseniaIngresada);
			
			if(auth.isAuthenticated()){
				setUsuario(userManagerService.getUsuarioIniciado(usuarioIngresado, contraseniaIngresada, perfilSeleccionadoUsuario));
				setPerfilUsuario(userManagerService.getPerfilUsuario(usuarioIngresado, contraseniaIngresada, perfilSeleccionadoUsuario));
				FacesContext.getCurrentInstance().getExternalContext().getSessionMap().put("usuarioLogueado", getUsuario());
				setDirMenu(userManagerService.getDireccionMenu(getPerfilUsuario()));
				FacesContext.getCurrentInstance().getExternalContext().getSessionMap().put("rolSeleccionado", getPerfilSeleccionadoUsuario());
				return "logueoCorrecto";
			}
			else {
				return "error";
			}
		} catch (Exception e) {
			e.printStackTrace();
			return "error";
		}    	
	}

	public Authentication validarContextSecurity(String usuario, String contrasenia)
	{
		HttpServletRequest request= getRequest();
		UsernamePasswordAuthenticationToken authReq=new UsernamePasswordAuthenticationToken(usuario+" "+getPerfilSeleccionadoUsuario(), contrasenia);
		authReq.setDetails(new WebAuthenticationDetails(request));			    	
		HttpSession session = request.getSession();
		session.setAttribute(AuthenticationProcessingFilter.SPRING_SECURITY_LAST_USERNAME_KEY, usuario);
		Authentication auth = getAuthenticationManager().authenticate(authReq);
		SecurityContext secCtx = SecurityContextHolder.getContext();	    	
		secCtx.setAuthentication(auth);
		session.setAttribute(HttpSessionContextIntegrationFilter.SPRING_SECURITY_CONTEXT_KEY, secCtx);   			    	
		String urlKey = AbstractProcessingFilter.SPRING_SECURITY_SAVED_REQUEST_KEY;	   
		session.removeAttribute(urlKey);
		return auth;
	}

	protected HttpServletRequest getRequest() {
		ExternalContext context = FacesContext.getCurrentInstance().getExternalContext();
		HttpServletRequest request = (HttpServletRequest) context.getRequest();	    
		return request;
	}
	
	public String cerrarSesionGeneric() {
		try{
		HttpSession se2=(HttpSession)FacesContext.getCurrentInstance().getExternalContext().getSession(false);
    	se2.invalidate();
		}catch(Exception e){e.printStackTrace();}
		return "error";
	}
	
	public static String obtenerRutaRaiz(HttpServletRequest request){
		String rutaRaiz;
		rutaRaiz=request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+request.getContextPath();
		return rutaRaiz;
	}

	
	public String iraListasDeValores(){
		return "listasDeValores";
	}
	
	public String iraRegistroIpnp(){
		return "registroIpnp";
	}
	
	public String iraHelpPage(){
		return "helpPage";
	}
	public String iraPaginaPrincipal(){
		return "pagPrincipal";
	}
	
	public String getRutaRaizServidor() {
		context=FacesContext.getCurrentInstance();
		request=(HttpServletRequest)context.getExternalContext().getRequest();
		rutaRaizServidor=obtenerRutaRaiz(request);
		return rutaRaizServidor;
	}
	public void setRutaRaizServidor(String rutaRaizServidor) {
		this.rutaRaizServidor = rutaRaizServidor;
	}  
	public String getRutaSoloRaizServidor() {
		context=FacesContext.getCurrentInstance();
		request=(HttpServletRequest)context.getExternalContext().getRequest();
		rutaSoloRaizServidor=request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort();
		return rutaSoloRaizServidor;
	}

	public void setRutaSoloRaizServidor(String rutaSoloRaizServidor) {
		this.rutaSoloRaizServidor = rutaSoloRaizServidor;
	}
	
	public String getUsuarioIngresado() {
		return usuarioIngresado;
	}

	public void setUsuarioIngresado(String usuarioIngresado) {
		this.usuarioIngresado = usuarioIngresado;
	}

	public String getContraseniaIngresada() {
		return contraseniaIngresada;
	}

	public void setContraseniaIngresada(String contraseniaIngresada) {
		this.contraseniaIngresada = contraseniaIngresada;
	}

	public Integer getPerfilSeleccionadoUsuario() {
		return perfilSeleccionadoUsuario;
	}

	public void setPerfilSeleccionadoUsuario(Integer perfilSeleccionadoUsuario) {
		this.perfilSeleccionadoUsuario = perfilSeleccionadoUsuario;
	}

	public UsuarioDTO getUsuario() {
		return usuario;
	}

	public void setUsuario(UsuarioDTO usuario) {
		this.usuario = usuario;
	}

	public FacesContext getContext() {
		return context;
	}

	public void setContext(FacesContext context) {
		this.context = context;
	}

	public String getPerfilUsuario() {
		return perfilUsuario;
	}

	public void setPerfilUsuario(String perfilUsuario) {
		this.perfilUsuario = perfilUsuario;
	}

	public String getDirMenu() {
		return dirMenu;
	}

	public void setDirMenu(String dirMenu) {
		this.dirMenu = dirMenu;
	}

	public AuthenticationManager getAuthenticationManager() {
		return authenticationManager;
	}

	public void setAuthenticationManager(AuthenticationManager authenticationManager) {
		this.authenticationManager = authenticationManager;
	}

	public void setRequest(HttpServletRequest request) {
		this.request = request;
	}
}



